package com.study.d012Components.tableview;

import javafx.application.Application;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.ScheduledService;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.control.cell.ChoiceBoxTableCell;
import javafx.scene.control.cell.ComboBoxTableCell;
import javafx.scene.control.cell.ProgressBarTableCell;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.Duration;
import javafx.util.StringConverter;

/**table 列自定义列类型
 * 五种类型： 参考TableCell的实现类
 * 		TextFieldTableCell
 * 		ComboBoxTableCell
 * 		ChoiceBoxTableCell
 * 		CheckBoxTableCell
 * 		CheckBoxTableCell
 *
*@description
*@author xtayhame
*date 2020年3月14日
*version
*since v1.0
*/
public class TableViewCustomizeCellMain extends Application{
	public static void main(String[] args) {
		launch(args);

	}
	@Override
	public void start(Stage stage) throws Exception {
		AnchorPane an = new AnchorPane();

		Button b1 =new Button("测试");

		TableView<Data> tableView = new TableView<Data>();


		an.getChildren().addAll(b1, tableView);
		AnchorPane.setTopAnchor(b1, 10.0);
		AnchorPane.setLeftAnchor(b1, 20.0);
		AnchorPane.setTopAnchor(tableView, 40.0);
		AnchorPane.setLeftAnchor(tableView, 20.0);

		stage.setTitle("自定义Table的列类型");
		stage.setScene(new Scene(an, 400, 500));
		stage.show();


		ObservableList<Data> datas=FXCollections.observableArrayList();
		Data d1 = new Data("张三", 19, 0.1, true);
		Data d2 = new Data("李四", 20, 0.2, true);
		Data d3 = new Data("王五", 21, 0.5, false);
		Data d4 = new Data("赵柳", 55, 0.9, true);

		datas.addAll(d1,d2,d3,d4);

		tableView.setItems(datas);

		TableColumn<Data, String> tc_name=new TableColumn<Data, String>("姓名");
		tc_name.setCellValueFactory(new PropertyValueFactory<Data, String>("name"));

		TableColumn<Data, Integer> tc_age=new TableColumn<Data, Integer>("年龄");
		tc_age.setCellValueFactory(new PropertyValueFactory<Data, Integer>("age"));


		TableColumn<Data, Double> tc_score=new TableColumn<Data, Double>("分数");
		tc_score.setCellValueFactory(new PropertyValueFactory<Data, Double>("score"));

		//这里要改为
	/*	TableColumn<Data,Number > tc_score=new TableColumn<Data, Number>("分数");
		tc_score.setCellValueFactory(new PropertyValueFactory<Data, Number>("score"));*/


		TableColumn<Data, Boolean> tc_is=new TableColumn<Data, Boolean>("是否选中");
		//tc_is.setCellValueFactory(new PropertyValueFactory<Data, Boolean>("is"));
		tc_is.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data,Boolean>, ObservableValue<Boolean>>() {
			@Override
			public ObservableValue<Boolean> call(CellDataFeatures<Data, Boolean> param) {
				return new SimpleBooleanProperty(param.getValue().isIs());
			}
		});

		tableView.getColumns().add(tc_name);
		tableView.getColumns().add(tc_age);
		tableView.getColumns().add(tc_score);
		tableView.getColumns().add(tc_is);

		//使用之前，需要开启可编辑模式
		tableView.setEditable(true);


		//使用第一种：TextFieldTableCell
		tc_name.setCellFactory(TextFieldTableCell.forTableColumn(new StringConverter<String>() {
			@Override
			public String toString(String object) {
				return object.toString();
			}

			@Override
			public String fromString(String string) {
				// TODO Auto-generated method stub
				return string + "-";
			}
		}));


		//使用第二种：ComboBoxTableCell  下拉框
		/*tc_score.setCellFactory(ComboBoxTableCell.forTableColumn(100,200));*/


		//使用第三种：ChoiceBoxTableCell 下拉选择框
		tc_age.setCellFactory(ChoiceBoxTableCell.forTableColumn(18,19,30));


		//使用第四种：CheckBoxTableCell, 这里要使用Property属性的字典，会自动选中
		tc_is.setCellFactory(CheckBoxTableCell.forTableColumn(tc_is));


		//使用第五种：ProgressBarTableCell ， 进度值在0.0 -- 1.0 之间
		tc_score.setText("进度条");
		//这里要使用
		tc_score.setCellFactory(ProgressBarTableCell.forTableColumn());

		MyService myService = new MyService();
		myService.setDelay(Duration.seconds(0));
		myService.setPeriod(Duration.seconds(1));
		myService.start();

		myService.valueProperty().addListener(new ChangeListener<Double>() {
			@Override
			public void changed(ObservableValue<? extends Double> observable, Double oldValue, Double newValue) {
				if(newValue !=null){
					if(newValue >=1.0){
						//结束任务
						myService.cancel();
						System.out.println("任务关闭");
					}

					//只更新第一条记录的进度
					Data d1= tableView.getItems().get(0);
					d1.setScore(newValue);
					tableView.refresh();
				}
			}
		});


		b1.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {

				/*d1.setName("李逵");
				tableView.refresh();*/

			}
		});

	}
}

//添加任务
class MyService extends ScheduledService<Double>{
	double i=0.1;

	@Override
	protected Task<Double> createTask() {
		Task<Double> task = new Task<Double>() {
			@Override
			protected Double call() throws Exception {
				i = i+0.1;
				return i;
			}
		};
		return task;
	}


}
